Linux向けインストーラー版AWS CLI はRHEL 6のような古い環境では動かなくなります

Linux向けインストーラー版AWS CLI はRHEL 6のような古い環境では動かなくなります

RHEL 7やAmazon Linux 1以降であれば問題無し。AWS CLI 2.17.52以降はmanylinux2014互換になり、Python 12で動作します。
Clock Icon2024.09.21

AWS CLIはAWSのREST APIをCLIから操作できるツールであり、WindowsやLinuxなどさまざまな環境向けにビルド済みのインストーラーが提供されています。

このツールに関して、2024/09/12のAWS Developer Tools Blogで"Linux Support Updates for AWS CLI v2"という記事が公開されました。

https://aws.amazon.com/blogs/developer/linux-support-updates-for-aws-cli-v2/

Beginning September 16, 2024, the AWS CLI v2 will provide compatibility with glibc-based Linux distributions that use glibc version 2.17 or later.

https://aws.amazon.com/blogs/developer/linux-support-updates-for-aws-cli-v2/

2024/09/16以降にリリースされるLinuxインストーラー向けAWS CLI(バージョン2.17.52以降)の実行環境では、glibc(C言語の共有ライブラリ)のバージョンが2.17以上である必要があると案内されています。

Amazon Linux 1RHEL 7 のglibcのバージョンがまさに最低要件の 2.17 であり、これより古いglibc 2.12ベースの RHEL 6 や glibc 2.15ベースの Ubuntu 12.04 で2024/09/16以降にリリースされたAWS CLIを実行すると、以下のエラーが発生します。

$ /usr/bin/aws --version

/usr/bin/aws: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/bin/aws)

9/16 頃にリリースされた各バージョンを試すと、 2.17.51 までは旧仕様、 2.17.52 からは新仕様でした。

$ ./2.17.51/dist/aws --version
aws-cli/2.17.51 Python/3.11.9 Linux/6.8.0-1016-aws exe/x86_64.ubuntu.24

$ ./2.17.52/dist/aws --version
aws-cli/2.17.52 Python/3.12.6 Linux/6.8.0-1016-aws exe/x86_64.ubuntu.24

エラーの回避策

エラー回避策を手間の低そうなものから順に列挙します。

glibc 2.17より古い環境を使わざるを得ない背景をもとに、方針を決定してください。

  • 旧世代で最新のAWS CLI 2.17.51を使い続ける($ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.17.51.zip" -o "awscliv2.zip")
  • ソースコードからAWS CLIをインストール
  • glibcのバージョンを 2.17 以上にアップグレード
  • 新しいLinuxディストリビューションに移行

Pythonのパッケージング互換性のためのmanylinux

依存するglibcのバージョンが変更されたことでアプリケーションが動作しなくなったように、互換性を保証するには、x86_64aarch64といった単純なCPUアーキテクチャの違いだけでは不十分であることがわかります。

そのため、Pythonのパッケージングにおいては、プラットフォームの互換性を保証する manylinux ポリシーが策定されています(PEP 600 – Future ‘manylinux’ Platform Tags for Portable Linux Built Distributions)。

glibc 2.17以上で動作する環境を、PEP 599 用語では manylinux2014PEP 600 用語では manylinux_2_17 と呼びます。

冒頭で紹介した案内の次の部分が該当します。

AWS CLI v2 Linux executables are built using Docker images published by the manylinux project. ... The Docker image that meets this criteria today is the manylinux2014 image, which uses glibc 2.17.

https://aws.amazon.com/blogs/developer/linux-support-updates-for-aws-cli-v2/

Alpine Linuxのように、libcにglibcではなくmuslを使っている環境向けには musllinux というポリシーが存在します。

バイナリ配布時に生じる動的リンクの問題は、Goのように静的リンクする言語では発生しません。AWS CLIとGo版AWS CLIのawslimとの違いを比較してみるのも面白いかもしれません。

https://speakerdeck.com/fujiwara3/layerx-dot-go-number-1

glibcとともにAWS CLIに同梱されるPythonも3.12にアップグレード

AWS CLIはPythonで実装されており、pyinstaller を使用してバイナリ化(LinuxだとELFファイル化)して配布されています。

$ file 2.17.52/dist/aws
2.17.52/dist/aws: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=3dfe013b3027047470d1aac10a3504baf6969725, for GNU/Linux 2.6.32, stripped

ビルド時のglibcのアップグレードと同時に、Pythonランタイムも3.11から3.12にアップグレードされました。

$ ./2.17.52/dist/aws --version
aws-cli/2.17.52 Python/3.12.6 Linux/6.8.0-1016-aws exe/x86_64.ubuntu.24

参考 [V2] Add Python 3.12 Support by aemous · Pull Request #8917 · aws/aws-cli · GitHub

まとめ

AWS CLI 2.17.52以降のLinuxインストーラーでは、glibcの最低バージョンが2.17に引き上げられました。Amazon Linux 1や RHEL 7であれば問題ありませんが、RHEL 6のような古い環境では実行時にエラーが発生します。

/usr/bin/aws: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/bin/aws)

このようなエラーが発生した場合、2.17より新しいバージョンの glibc 環境を用意して今後リリースされる AWS CLIに対応したり、AWS CLI 2.17.51までの古いバージョンを使い続けるといった判断が求められます。

参考

付録 : エラー再現方法

ホストにAWS CLIをインストーラー経由でインストール

Docker経由でこのAWS CLIを CentOS 6/7 のゲストから実行

$ docker run -v $(pwd)/aws:/aws \
  -it centos:centos6 /bin/bash -c \
  "cat /etc/system-release && ldd --version && /aws/dist/aws --version"

CentOS release 6.10 (Final)
ldd (GNU libc) 2.12
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
/aws/dist/aws: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /aws/dist/aws)

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.